package net.herrialde.geo.activity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import net.herrialde.geo.R;
import net.herrialde.geo.bean.GeoDirection;
import net.herrialde.geo.bean.Kalea;
import net.herrialde.geo.bean.Komunitatea;
import net.herrialde.geo.bean.Portal;
import net.herrialde.geo.bean.Probintzia;
import net.herrialde.geo.bean.Udalerria;
import net.herrialde.geo.util.Constants;
import net.herrialde.geo.util.GoogleUtil;
import net.herrialde.geo.util.RemoteUtil;
import net.herrialde.geo.util.Utils;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class GeoActivity extends Activity {

	private int GEOTOP_LEVEL = Constants.EUSKALHERRIA_LEVEL; // Nivel altual
	private String jsonId = "comunidadId";
	
	private ListView mainListView = null;
	private SimpleAdapter listAdapter = null;
	private TextView titulo_tv = null;
	private TextView result_tv = null;
	private TextView itemId = null;
	private Context geoContext = null;
	private String codigoItem = null;
	private String nameItem = null;
	private int numPortal = -1;
	JSONArray jar = null;
	private JSONObject lastJson = null;
	private String coordenadas = null;
	
	private GeoDirection direction = null;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		geoContext = getApplicationContext();
		
		setContentView(R.layout.main);
		
		direction = new GeoDirection();
		
		mainListView = (ListView) findViewById(R.id.mainListView);

		if (listAdapter == null) {
			listAdapter = getAdapterForItems(0);
		}
		mainListView.setAdapter(listAdapter);
		mainListView.setSelection(50); // prueba 

		titulo_tv = (TextView) findViewById(R.id.tv_toponimo);
		
		mainListView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick( 
					AdapterView<?> parent, 	//el padre es el ListView
					View view,    			// Item seleccionado
					int position, 			// posicion del item en la lista
					long id) {    			// identificador del Item  
				
				itemId = (TextView) view.findViewById(R.id.codigo);
				//itemId.setVisibility(View.GONE); //TODO no tiene ningún efecto
				
				TextView itemName = (TextView) view.findViewById(R.id.name);
				codigoItem = (String) itemId.getText();
				nameItem = (String) itemName.getText();
				
				if (GEOTOP_LEVEL == Constants.PORTAL_LEVEL) { // Guardamos el JSON seleccionado
					numPortal = Integer.parseInt(nameItem);
					try {
						lastJson = Utils.findJSONObject(jar, "numero", numPortal);
					} catch (JSONException e) {
						e.printStackTrace();
					}
				}
				
				result_tv = (TextView) findViewById(R.id.resultView);
				
				// Cambiamos el adaptador para el topónimo seleccionado
				listAdapter = getAdapterForItems(Integer.parseInt(codigoItem));
				mainListView.setAdapter(listAdapter);
				
				Toast.makeText( getApplicationContext(),
			    		"ID: " + codigoItem + " - Municipio: " + nameItem, 
			    		Toast.LENGTH_SHORT).show();
			}		
		});
	}
	
	private SimpleAdapter getAdapterForItems(int id) {
		SimpleAdapter adapter = null;
		List<HashMap<String, String>> datos = new ArrayList<HashMap<String, String>>();
		
		String[] columnTags = new String[] {"id", "Nombre"};
		int[] columnIds = new int[] {R.id.codigo, R.id.name};
		
		if (GEOTOP_LEVEL == Constants.EUSKALHERRIA_LEVEL) {
			jar = RemoteUtil.getJSONArrayComunidades(geoContext);
			GEOTOP_LEVEL++;
		}
		else {
			jar = getJSONItems(id);
		}
		try {
			if (jar != null) {
				int n = jar.length();
				Log.i("***DGA***", "GEOTOP_LEVEL: " + GEOTOP_LEVEL + "\t" + n + " items");
				for (int i = 0; i < n; i++) {
					HashMap<String,String> map = new HashMap<String, String>();
					JSONObject obj = jar.getJSONObject(i);
					map.put(columnTags[0], ""+obj.getLong(jsonId));
					
					// ÑAPA
					String key = "nombreEu";
					if (GEOTOP_LEVEL == 4)
						key = "nombreEs";
					if (GEOTOP_LEVEL == 5)
						key = "numero";
					
					map.put(columnTags[1], obj.getString(key));
					datos.add(map);
					// Creamos el Adapter
					adapter = new SimpleAdapter(this, datos, R.layout.listrow, columnTags , columnIds);
				}
			}
		} catch (JSONException e) {
			Toast.makeText(geoContext, "ERROR al crear el objeto SimpleAdapter con GEOTOP_LEVEL=" + GEOTOP_LEVEL,
					Toast.LENGTH_SHORT).show();
			e.printStackTrace();
		}
		return adapter;
	}
	
	/**
	 * Lee items para el topónimo actual
	 * @param parentId
	 * @return
	 */
	private JSONArray getJSONItems(int parentId) {
		JSONArray jar = null;
		switch (GEOTOP_LEVEL) {
		case Constants.KOMUNITATEA_LEVEL:
			Komunitatea komunitatea = new Komunitatea();
			komunitatea.setId(Integer.parseInt(codigoItem));
			komunitatea.setName(nameItem);
			direction.setKomunitatea(komunitatea);
			jsonId = "provinciaId";
			jar = RemoteUtil.getJSONArrayProvincias(geoContext, Integer.parseInt(codigoItem));
			titulo_tv.setText(R.string.provincias);
			break;
		case Constants.PROBINTZIA_LEVEL:
			Probintzia probintzia = new Probintzia();
			probintzia.setId(Integer.parseInt(codigoItem));
			probintzia.setName(nameItem);
			direction.setProbintzia(probintzia);
			jsonId = "codMunicipio";
			jar = RemoteUtil.getJSONArrayMunicipios(geoContext, parentId);
			titulo_tv.setText(R.string.municipios);
			break;
		case Constants.UDALERRIA_LEVEL:
			Udalerria udalerria = new Udalerria();
			udalerria.setId(Integer.parseInt(codigoItem));
			udalerria.setName(nameItem);
			direction.setUdalerria(udalerria);
			jsonId = "codCalle";
			jar = RemoteUtil.getJSONArrayCalles(geoContext, parentId);
			titulo_tv.setText(R.string.calles);
			break;
		case Constants.KALEA_LEVEL:
			Kalea calle = new Kalea();
			calle.setCalleId(Integer.parseInt(codigoItem));
			calle.setName(nameItem);
			direction.setKalea(calle);
			jsonId = "codPortal";
			jar = RemoteUtil.getJSONArrayPortales(geoContext, parentId);
			titulo_tv.setText(R.string.portales);
			break;
		case Constants.PORTAL_LEVEL: // Último nivel de selecciones
			Portal portal = new Portal();
			try {
				portal.setNumero(lastJson.getInt("numero"));
				portal.setLatitud(lastJson.getString("Lat"));
				portal.setLongitud(lastJson.getString("Lon"));
			} catch (JSONException e) {
				e.printStackTrace();
			}
			direction.setPortal(portal);
			jsonId = "codPortal";
			titulo_tv.setText(R.string.dircompleta);
			
			// Buscamos también las coordenadas con el API de Google Maps
			String latlong = GoogleUtil.searchGoogleMapsDir(direction);
			titulo_tv.setText(titulo_tv.getText() + "\nGoogle API: " + latlong);
			Log.i("***DGA***", "Google API: " + latlong);  // para poder copiar
			muestraMapa(direction);
			break;
		default:
			jar = RemoteUtil.getJSONArrayComunidades(geoContext);
			titulo_tv.setText(R.string.estado);
		}
		
		// Mostramos los resultados en cada paso
		result_tv.setText(direction.getAsTring());
		
		GEOTOP_LEVEL++;
		if (GEOTOP_LEVEL > 5)
			GEOTOP_LEVEL = Constants.EUSKALHERRIA_LEVEL;
		return jar;
	}

	private void muestraMapa(GeoDirection direction2) {
		WebView webview = (WebView) findViewById(R.id.webview);
		webview.getSettings().setJavaScriptEnabled(true);
		//recuperamos el código de la página a mostrar e introducimos los datos
		String html = getString(R.string.mapaweb);
		html = html.replace("$$PROVINCIA$$", direction.getProbintzia().getName());
		html = html.replace("$$CIUDAD$$", direction.getUdalerria().getName());
		html = html.replace("$$CALLE$$", direction.getKalea().getName());
		html = html.replace("$$NUMERO$$", ""+direction.getPortal().getNumero());
		html = html.replace("$$LATITUD$$", direction.getPortal().getLatitud());
		html = html.replace("$$LONGITUD$$", direction.getPortal().getLongitud());
		// Presentamos la ubicación del portal en un mapa
		webview.loadData(html, "text/html", null);
	}
	
}